Processing math: 100%

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

C++
C#

Модуларна аритметика

Кажемо да је број r остатак при дељењу броја x бројем y и пишемо xmody=r ако и само ако постоји број q такав да је x=qy+r и 0r<y. Поред тога што са mod означавамо бинарну операцију, mod се може користити и као ознака бинарне релације у скупу целих бројева. Наиме, писаћемо abmodm ако m|(ab). Ово је еквивалентно томе да a и b дају исти остатак при дељењу са m. На пример, пишемо 122mod5 јер 5|(122).

Релацију mod користимо у неким свакодневним ситуацијама, а да тога често нисмо ни свесни.

  • Један од таквих примера је рад са временом. Наиме, за 15 сати након 11 часова рећи ћемо да је 2 сата (што одговара томе да је 11+152mod24).

  • Слично важи и за дане у недељи, које рачунамо по модулу 7. Ако је данас, рецимо, четвртак и интересује нас који ће дан бити за сто дана, не морамо да бројимо један по један дан. Сваком дану можемо придружити неки остатак при дељењу са 7 (0 - понедељак, 1 - уторак, 2 - среда, 3 - четвртак, 4 - петак, 5 - субота, 7 - недеља), а затим израчунати (3+100)mod7=5 и знаћемо да је за 100 дана субота (проћи ће 14 пуних недеља тј. 98 дана и биће поново четвртак, након 99 дана ће бити петак, а након 100 субота). Аналогно се рачуна и месец или редни број недеље у години.

  • Слично важи и приликом рада са угловима (које рачунамо по модулу 360 степени).

Модуларна аритметика има пуно практичних примена: користи се за израчунавање контролних сума за међународне стандардне идентификаторе књига (ISBN бројеве) и идентификаторе банки (IBAN). Модуларна аритметика је и у основи савремених криптографских система.

Бројеви се у рачунарима представљају по модулу 2k. На пример, у језику C++ бројеви типа unsigned int представљају се по модулу 232. На пример, у језику C# бројеви типа uint представљају се по модулу 232. У наредном коду резултат квадрирања броја 123456789 биће вредност 1234567892mod32=2537071545.

unsigned int x = 123456789;
cout << x*x << endl;

Сабирање и множење по модулу

Уколико је потребно одредити вредност збира или производа бројева по модулу m од помоћи нам могу бити наредне релације:

(a+b)modm=(amodm + bmodm)modm

(ab)modm=(amodm  bmodm)modm

Доказ коректности. за доказивање, па је остављамо за вежбу). Претпоставимо да је a=qam+ra и b=qbm+rb за 0ra,rb<m. Тада важи да је ab = (qam+ra)(qbm+rb) = (qaqbm+qarb+raqb)m+rarb. Ако важи да је rarb=qm+r за 0r<m, тада је са ab=(qaqbm+qarb+raqb+q)m+r, па је (ab)modm=r. Са друге стране, важи да је (amodm  bmod m)modm=(rarb)modm=r, чиме је тврђење доказано.

Одузимање по модулу

Размотримо проблем одређивања разлике бројева b и a по модулу m. На пример, потребно је одредити вредност (ba)modm. Желели бисмо да као вредност овог израза добијемо ненегативну вредност чак и у случају када је b<a. Међутим, не постоји сагласност између различитих програмских језика у рачунању вредности x % m када је x негативно. Наиме, у језику C++ и у језику C# бисмо за вредност остатка добили негативан број: вредност израза (2 - 7) % 3 била би -2, док би у језику Python као резутат добили позитиван број 1. Уместо да вршимо испитивање да ли је дељеник негативан, ако је 0a,b<m, позитиван резултат је могуће добити израчунавањем вредности израза (ba+m)modm. Додавањем вредности m, вредност ba+m ће постати сигурно ненегативна (јер разлика ba не може бити мања од m), а тражење остатка ће практично поништити првобитно додавање вредности m). У претходном смо се ослонили на чињеницу да су и a и b бројеви који су већи или једнаки од 0 и строго мањи од m. Проналажење вредности разлике по модулу m могуће је и у општем случају и важи

(BA)modm=(BmodmAmodm+m)modm

Доказ коректности. Докажимо ово тврђење. Подсетимо се да је xmody=r ако и само ако постоји q такав да је x=qy+r и ако је 0r<y. Нека је A=qam+a и B=qbm+b, за 0a,b<m. Зато је Amodm=a и Bmodm=b. Нека је BA+m=pm+r за неко 0r<m. Зато је (BmodmAmodm+m)modm=(ba+m)modm=r. Такође, важи и да је BA=(qbqa)m+(ba)=(qbqa1)m+(ba+m)=(qbqa1+p)m+r, па је и (BA)modm=r, чиме је тврђење доказано.

Степеновање по модулу

Као последица множења по модулу, важи и наредно тврђење, које омогућава да се израчуна степен по модулу:

anmodm=(amodm)nmodm

Модуларна аритметика

Кажемо да је број r остатак при дељењу броја x бројем y и пишемо xmody=r ако и само ако постоји број q такав да је x=qy+r и 0r<y. Поред тога што са mod означавамо бинарну операцију, mod се може користити и као ознака бинарне релације у скупу целих бројева. Наиме, писаћемо abmodm ако m|(ab). Ово је еквивалентно томе да a и b дају исти остатак при дељењу са m. На пример, пишемо 122mod5 јер 5|(122).

Релацију mod користимо у неким свакодневним ситуацијама, а да тога често нисмо ни свесни.

  • Један од таквих примера је рад са временом. Наиме, за 15 сати након 11 часова рећи ћемо да је 2 сата (што одговара томе да је 11+152mod24).

  • Слично важи и за дане у недељи, које рачунамо по модулу 7. Ако је данас, рецимо, четвртак и интересује нас који ће дан бити за сто дана, не морамо да бројимо један по један дан. Сваком дану можемо придружити неки остатак при дељењу са 7 (0 - понедељак, 1 - уторак, 2 - среда, 3 - четвртак, 4 - петак, 5 - субота, 7 - недеља), а затим израчунати (3+100)mod7=5 и знаћемо да је за 100 дана субота (проћи ће 14 пуних недеља тј. 98 дана и биће поново четвртак, након 99 дана ће бити петак, а након 100 субота). Аналогно се рачуна и месец или редни број недеље у години.

  • Слично важи и приликом рада са угловима (које рачунамо по модулу 360 степени).

Модуларна аритметика има пуно практичних примена: користи се за израчунавање контролних сума за међународне стандардне идентификаторе књига (ISBN бројеве) и идентификаторе банки (IBAN). Модуларна аритметика је и у основи савремених криптографских система.

Бројеви се у рачунарима представљају по модулу 2k. У наредном коду резултат квадрирања броја 123456789 биће вредност 1234567892mod32=2537071545.

unsigned int x = 123456789;
cout << x*x << endl;

Сабирање и множење по модулу

Уколико је потребно одредити вредност збира или производа бројева по модулу m од помоћи нам могу бити наредне релације:

(a+b)modm=(amodm + bmodm)modm

(ab)modm=(amodm  bmodm)modm

Доказ коректности. за доказивање, па је остављамо за вежбу). Претпоставимо да је a=qam+ra и b=qbm+rb за 0ra,rb<m. Тада важи да је ab = (qam+ra)(qbm+rb) = (qaqbm+qarb+raqb)m+rarb. Ако важи да је rarb=qm+r за 0r<m, тада је са ab=(qaqbm+qarb+raqb+q)m+r, па је (ab)modm=r. Са друге стране, важи да је (amodm  bmod m)modm=(rarb)modm=r, чиме је тврђење доказано.

Одузимање по модулу

Размотримо проблем одређивања разлике бројева b и a по модулу m. На пример, потребно је одредити вредност (ba)modm. Желели бисмо да као вредност овог израза добијемо ненегативну вредност чак и у случају када је b<a. Међутим, не постоји сагласност између различитих програмских језика у рачунању вредности x % m када је x негативно. Наиме, у језику C++ и у језику C# бисмо за вредност остатка добили негативан број: вредност израза (2 - 7) % 3 била би -2, док би у језику Python као резутат добили позитиван број 1. Уместо да вршимо испитивање да ли је дељеник негативан, ако је 0a,b<m, позитиван резултат је могуће добити израчунавањем вредности израза (ba+m)modm. Додавањем вредности m, вредност ba+m ће постати сигурно ненегативна (јер разлика ba не може бити мања од m), а тражење остатка ће практично поништити првобитно додавање вредности m). У претходном смо се ослонили на чињеницу да су и a и b бројеви који су већи или једнаки од 0 и строго мањи од m. Проналажење вредности разлике по модулу m могуће је и у општем случају и важи

(BA)modm=(BmodmAmodm+m)modm

Доказ коректности. Докажимо ово тврђење. Подсетимо се да је xmody=r ако и само ако постоји q такав да је x=qy+r и ако је 0r<y. Нека је A=qam+a и B=qbm+b, за 0a,b<m. Зато је Amodm=a и Bmodm=b. Нека је BA+m=pm+r за неко 0r<m. Зато је (BmodmAmodm+m)modm=(ba+m)modm=r. Такође, важи и да је BA=(qbqa)m+(ba)=(qbqa1)m+(ba+m)=(qbqa1+p)m+r, па је и (BA)modm=r, чиме је тврђење доказано.

Степеновање по модулу

Као последица множења по модулу, важи и наредно тврђење, које омогућава да се израчуна степен по модулу:

anmodm=(amodm)nmodm